/*
 * @Description: 对于管理员数据相关的操作
 * @Author: pinus
 * @Email: pinus0716@163.com
 * @Git: https://gitee.com/xyf97
 * @Date: 2021-10-07 11:41:55
 * @LastEditTime: 2021-10-09 20:28:32
 */

const { parseInt, result } = require('lodash')
const path = require('path')
const daoModule = require('./DAO') // 加载数据库通用操作
const databaseModule = require(path.join(process.cwd(), 'modules/database'))
const { Op } = require('sequelize')

/**
 * @description: 创建管理员
 * @param {*} obj
 * @param {*} cb
 * @return {*}
 */
module.exports.create = function (obj, cb) {
  daoModule.create('ManagerModel', obj, cb)
}

/**
 * @description: 获取管理员列表
 * @param {*} conditions
 * @param {*} cb
 * @return {*}
 */
module.exports.list = function (conditions, cb) {
  daoModule.list('ManagerModel', conditions, function (err, models) {
    if (err) return cb(err, null)
    cb(null, models)
  })
}

/**
 * @description: 通过查询条件获取管理员对象
 * @param {*} conditions
 * @param {*} cb
 * @return {*}
 */
module.exports.findOne = function (conditions, cb) {
  daoModule.findOne('ManagerModel', conditions, cb)
}

/**
 * @description: 通过[关键词]查询用户
 * @param {*} key
 * @param {Number} offset
 * @param {Number} limit
 * @param {*} cb
 * @return {*}
 */
module.exports.findByKey = function (key, offset, limit, cb) {
  const db = databaseModule.getDataBase() // 数据库句柄
  // sql语句通过 SELECT从FROM的表中获取数据; as 实现重命名; LEFT JOIN 实现表之间的关联
  // 效果：从表sp_manager中找出所有数据，同时将表sp_role中id值相同的数据也添加上一起返回
  sql = 'SELECT * FROM sp_manager as mgr LEFT JOIN sp_role as role ON mgr.role_id = role.role_id'

  if (key) {
    // 筛选数据：只需要 mgname中包含指定字段的数据
    sql += ' WHERE mg_name LIKE ? LIMIT ?,?'
    db.query(sql, { replacements: ['%' + key + '%', offset, limit], type: db.QueryTypes.SELECT })
      .then(managers => cb(null, managers))
      .catch(err => cb('查询执行出错1-' + err))
  } else {
    // 对返回数据的开始偏移值（忽略前x项）和最终返回几项的限制
    sql += ' LIMIT ?,? '
    db.query(sql, { replacements: [offset, limit], type: db.QueryTypes.SELECT })
      .then(managers => cb(null, managers))
      .catch(err => cb('查询执行出错1-' + err))
  }
}

/**
 * @description: 判断是否存在同名管理员
 * @param {*} username
 * @param {*} cb
 * @return {*}
 */
module.exports.exists = async function (username, cb) {
  const db = databaseModule.getDataBase()
  const Model = db.models.ManagerModel

  const options = {
    where: {
      mg_name: username
    }
  }
  const result = await Model.findAndCountAll(options).catch(err => cb(err))
  count = result.count
  if (count > 0) cb(null, true)
  else if (count == 0) cb(null, false)
  else cb('查询失败-' + count)
}

/**
 * @description: 模糊查询用户数量
 * @param {*} key
 * @param {*} cb
 * @return {*}
 */
module.exports.countByKey = async function (key, cb) {
  const db = databaseModule.getDataBase()
  const model = db.models['ManagerModel']

  const options = {
    where: {
      mg_name: {
        [Op.like]: '%' + key + '%'
      }
    }
  }
  model
    .findAndCountAll(options)
    .then(result => {
      // console.log(result.count)
      cb(null, result.count)
    })
    .catch(err => cb('查询执行出错: ' + err))

  // 注释部分为原始写法
  // count() sql语句函数，返回数目
  // sql = 'SELECT count(*) as count FROM sp_manager'
  // if (key) {
  //   sql += ' WHERE mg_name LIKE ?'
  //   db.driver.execQuery(sql, ['%' + key + '%'], function (err, result) {
  //     if (err) return cb('查询执行出错')
  //     cb(null, result[0]['count'])
  //   })
  // } else {
  //   db.driver.execQuery(sql, function (err, result) {
  //     if (err) return cb('查询执行出错')
  //     cb(null, result[0]['count'])
  //   })
  // }
}

/**
 * @description: 通过ID获取管理员对象数据
 * @param {*} id
 * @param {*} cb
 * @return {*}
 */
module.exports.show = function (id, cb) {
  daoModule.show('ManagerModel', id, cb)
}

/**
 * @description: 更新管理员信息
 * @param {*} obj
 * @param {*} cb
 * @return {*}
 */
module.exports.update = function (obj, cb) {
  const conditions = {
    where: {
      mg_id: obj.mg_id
    }
  }
  daoModule.update('ManagerModel', conditions, obj, cb)
}

/**
 * @description: 删除管理员对象数据
 * @param {*} id
 * @param {*} cb
 * @return {*}
 */
module.exports.destroy = function (id, cb) {
  const conditions = {
    where: {
      mg_id: id
    }
  }
  daoModule.destroy('ManagerModel', conditions, function (err) {
    if (err) return cb(err)
    return cb(null)
  })
}

/**
 * @description: 保存管理员信息
 * @param {*} obj
 * @param {*} cb
 * @return {*}
 */
// module.exports.save = function (obj, cb) {
//   daoModule.show(obj.mg_id, function (err, oldObj) {
//     if (err) {
//       daoModule.create('ManagerModel', obj, cb)
//     } else {
//       daoModule.update('ManagerModel', obj.mg_id, obj, cb)
//     }
//   })
// }

/**
 * @description: 获取管理员数量
 * @param {*} cb
 * @return {*}
 */
// module.exports.count = function (cb) {
//   daoModule.count('ManagerModel', cb)
// }
